import logging
from django.shortcuts import render
from django.views import View
from django import http
from django.core.cache import cache  # cache模块存储到redis是什么类型取出来还是什么类型，django_redis存到redis后取出来是bytes类型
from django_redis import get_redis_connection

from .models import Area
from meiduo_mall.utils.response_code import RETCODE

# Create your views here.

logger = logging.getLogger('django')

"""
为何使用cache模块做缓存而不用django_redis模块做缓存
1. django_redis将数据写入redis调用的api，存储的数据必须是bytes，string，float类型，不支持list类型，存list要先将list转为str
2. django_redis读取redis中的数据，如果读取的是None，None是没有decode方法的，而且读出来好要进行decode解码，存储的list数据还要进行eval将str转list
3. 使用cache模块，可以直接对api中的参数赋值为列表，取出来的数据也为列表，即存储的是什么类型取出来是什么类型，存取只需要两行代码，而使用django_redis要多行代码
"""


class AreasView(View):
    """获取省市区视图"""
    def get(self, request):
        # 获取area_id参数
        area_id = request.GET.get('area_id')

        # # 创建redis链接
        # redis_conn = get_redis_connection('default')

        # 判断查询等级
        if not area_id:
            # 查询市
            # 查看缓存中是否有该信息
            province_list = cache.get('province_list')  # 使用cache模块
            # province_list = redis_conn.get('province_list_1').decode()  # 如果为None，None是没有decode方法的
            if not province_list:
                # 没有缓存信息，重新查询
                try:
                    province_model_list = Area.objects.filter(parent__isnull=True)
                    # 构建响应数据
                    """
                    {
                      "code":"0",
                      "errmsg":"OK",
                      "province_list":[
                          {
                              "id":110000,
                              "name":"北京市"
                          },
                          {
                              "id":120000,
                              "name":"天津市"
                          },
                          {
                              "id":130000,
                              "name":"河北省"
                          },
                          ......
                      ]
                    }
                    """
                    province_list = [{'id': province_model.id, 'name': province_model.name} for province_model in province_model_list]
                    # province_list = str(province_list)

                    # 进行缓存处理
                    cache.set('province_list', province_list, 3600)  # 使用cache模块
                    # redis_conn.set('province_list_1', province_list, 3600)
                except Exception as e:
                    logger.error(e)
                    return http.JsonResponse({'code': RETCODE.DBERR, 'errmsg': '查询数据库失败'})

            # province_list = eval(province_list)

            return http.JsonResponse({'code': RETCODE.OK, 'errmsg': 'OK', 'province_list': province_list})
        else:
            # 查询市或区
            sub_data = cache.get('sub_area_' + area_id)
            if not sub_data:
                try:
                    """
                    {
                      "code":"0",
                      "errmsg":"OK",
                      "sub_data":{
                          "id":130000,
                          "name":"河北省",
                          "subs":[
                              {
                                  "id":130100,
                                  "name":"石家庄市"
                              },
                              ......
                          ]
                      }
                    }
                    """
                    main_model = Area.objects.get(id=area_id)
                    # # 方法一
                    # sub_model_list = Area.objects.filter(parent_id=area_id)
                    # 方法二
                    sub_model_list = main_model.subs.all()  # 一查多用1.subs.all()
                    # 构建响应数据
                    subs = [{'id': sub_model.id, 'name': sub_model.name} for sub_model in sub_model_list]
                    sub_data = {'id': main_model.id, 'name': main_model.name, 'subs': subs}

                    # 进行缓存
                    cache.set('sub_area_' + area_id, sub_data, 3600)

                except Exception as e:
                    logger.error(e)
                    return http.JsonResponse({'code': RETCODE.DBERR, 'errmsg': '查询数据库失败'})

            return http.JsonResponse({'code': RETCODE.OK, 'errmsg': 'OK', 'sub_data': sub_data})


